package com.eques.demo

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.inputmethod.EditorInfo
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import com.eques.base.BaseActivity
import com.eques.event.EventTotalThread
import com.eques.icvss.core.module.user.BuddyType
import com.eques.service.DoorBellService
import com.eques.util.AppUtils
import com.eques.util.Config
import com.eques.util.EquesMytool
import com.eques.util.HttpUtil
import com.eques.util.HttpsUtils
import com.eques.util.StringUtils
import okhttp3.OkHttpClient
import okhttp3.Request
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.json.JSONObject
import java.io.IOException
import java.util.concurrent.Executors


/**
 * date 2024/12/17
 * login page
 */
class LoginActivity : BaseActivity() {

    lateinit var edt_user_name: EditText
    lateinit var tv_user_pwd: TextView
    lateinit var btn_login: Button
    lateinit var btn_register: Button
    private var key: String = ""
    val TAG: String? = LoginActivity::class.simpleName
    private lateinit var userName: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        EventBus.getDefault().register(this);
        if (loginState == true) {
            startMain()
        } else {
            initView()
            initData()
        }

    }


    /**
     * 初始化视图组件并设置登录按钮点击事件
     *
     * 在这个方法中，我们初始化了用户名和密码输入框以及登录按钮，并为登录按钮设置了点击事件监听器
     * 当用户点击登录按钮时，会执行以下操作：
     * 1. 获取用户名和密码的输入内容
     * 2. 对密码进行MD5加密处理
     * 3. 如果用户名或密码为空，则显示提示信息并返回
     * 4. 打印日志信息，包括服务器IP和SSL Socket工厂信息
     * 5. 调用门铃服务的登录方法进行登录验证
     */
    override fun initView() {
        // 初始化用户名输入框
        edt_user_name = findViewById(R.id.edt_user_name)
        // 初始化密码输入框
        tv_user_pwd = findViewById(R.id.tv_user_pwd)
        // 初始化登录按钮
        btn_login = findViewById(R.id.btn_login)
        // 注册按钮
        btn_register = findViewById(R.id.btn_register)

        btn_register.setOnClickListener {
            startActivity(Intent(this, RegisterActivity::class.java))
        }

        // 为登录按钮设置点击事件监听器
        btn_login.setOnClickListener {
            btnLogin()
        }

        edt_user_name.setOnEditorActionListener { _, actionId, _ ->
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                btnLogin()
                true
            }
            false
        }
    }

    private fun btnLogin(){
        // 获取用户名输入内容
        userName = edt_user_name.text.toString()
        // 检查用户名和密码是否为空
        if (StringUtils.isBlank(userName)) {
            // 如果用户名或密码为空，显示提示信息并返回
            showToast(getString(R.string.input_error))
            return
        }

        if (StringUtils.isBlank(key)) {
            checkAccount(userName)
        } else {
            login()
        }
    }

    private fun login() {
        // 打印日志信息，包括服务器IP和SSL Socket工厂信息
        val url = preference.getMainUrl()
        Log.e(TAG, url + "=====>" + HttpsUtils.getSslSocketFactory())
        preference.putString(Config.EQUES_USER_NAME, userName)
        if (key.startsWith("\$")) {
            key = key.substring(1, key.length)
        }
        preference.putString(Config.EQUES_USER_KEY, key)
        // 调用门铃服务的登录方法进行登录验证
        DoorBellService.icvss!!.equesLocalLoginV2(
            AppUtils.context,
            userName, //用户名
            key, // 登录秘钥
            url, //获取分发的主ip地址
            "oauth",//认证方式
            "passwd_md5",//加密方式
            Config.THIRD_APP_SECRET,//第三方可以,需要向移康申请
            Config.THIRD_SERVER_APPID,//APP_ID
            "",
            "",
            HttpsUtils.getSslSocketFactory(),//Application 中创建
            true//第三方接入必选传true
        )
    }

    private fun checkAccount(name: String) {
        val nonce = System.currentTimeMillis() / 1000
        val sign = EquesMytool(this).md5(userName + nonce.toString() + Config.THIRD_APP_SECRET)
        val jsonBody = JSONObject()
        jsonBody.put("id", Config.THIRD_BRAND_ID)
        jsonBody.put("name", name)
        jsonBody.put("nonce", nonce)
        jsonBody.put("sign", sign)
        val registerUrl = Config.checkAccount(preference.getSubUrl())
        HttpUtil.postJsonAsync(
            url = registerUrl.toString(),
            jsonBody = jsonBody.toString()
        ) { result ->
            result.onSuccess { response ->
                println("POST Response: $response")
                val jsonObject = JSONObject(response)
                val code = jsonObject.optInt("code")
                if (code == 0) {
                    val dataKey = jsonObject.optString("data")
                    //用户登录快捷密码，不建议存储本地，可绑定自有app账号，保存于服务器，登录时使用
                    preference.putString(Config.EQUES_USER_KEY, dataKey)
                    key = dataKey
                    login()
                } else {
                    runOnUiThread {
                        showToast("账号不存在，请先注册！")
                    }
                }
            }.onFailure { exception ->
                println("POST Error: ${exception.message}")
            }
        }
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onRefreshEvent(event: EventTotalThread) {
        when (event.refresh) {
            Config.EVENT_LOGIN_STATE -> {
                userName = event.stringMsg!!
                preference.putBoolean(Config.LOGIN_STATE, true)
                startMain()
            }
        }
    }

    private fun startMain() {
        var intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
        finish()
    }

    override fun initData() {

    }

    override fun onResume() {
        super.onResume()
    }

    override fun onDestroy() {
        super.onDestroy()
        EventBus.getDefault().unregister(this);
    }

}